package com.springcloud.tread.service;

import cn.hutool.core.collection.CollUtil;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.springcloud.tread.pojo.Index;
import com.springcloud.tread.util.SpringContextUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@Service
@CacheConfig(cacheNames="indexes")//表示添加到缓存里的名字
public class StoreSerice {

    @Autowired
    RestTemplate restTemplate;
    private List<Index> list;

    /**
     * 刷新操作
     * 首先会删除掉缓存中的数据
     * 其次再是保存数据到缓存
     * 最后得到最新的数据
     *
     * 为什么这样做：
     * 原因：
     * 1.缓存中的数据不能同步更新，当再次调用的时候会得到不是最新数据
     * 2.如果获取数据的服务断点了，缓存中保存的数据就是熔断时的错误信息，这并不是想要的
     * 使用了这种方式之后，就可以从缓存当中同步获取到最新数据了。
     */
    @HystrixCommand(fallbackMethod = "hystrixGet")
    public List<Index> fresh(){
         list = getData();
         StoreSerice storeSerice= SpringContextUtil.getBean(StoreSerice.class);//springBoot存在小漏洞，需要从容器中重新获取到这个Bean才能做接下来的操作
         storeSerice.reomve();
         return storeSerice.store();
    }

    //删除
    @CacheEvict(allEntries = true) //删除所有缓存
    public  void reomve(){

    }

    //保存
    @Cacheable(key="'all_codes'")
    public  List<Index> store(){
        return list;  //第一次调用会把数据保存到缓存当中
     }

     //从缓存中获取
     @Cacheable(key="'all_codes'")//先查看缓存中是否有数据,有则直接返回，没有则调用方法，方法返回的是一个空的list,同步到reids缓存
     public  List<Index> get(){
         return CollUtil.toList();
     }


//    @HystrixCommand(fallbackMethod = "hystrixGet")
//   @Cacheable(key="'all_codes'") //表示保存到 redis 用的 key 就会使 all_codes.
    public List<Index> getData() {
        List<Map> lists = restTemplate.getForObject("http://localhost:7010/indexes/codes.json", List.class);
        return get(lists);
    }


    public List<Index> get(List<Map> lists) {
        ArrayList<Index> arrayList = new ArrayList<>();
        for (Map map : lists) {
            String code = (String) map.get("code");
            String name = (String) map.get("name");
            Index index = new Index();
            index.setName(name);
            index.setCode(code);
            arrayList.add(index);
        }

        return arrayList;
    }

    public List<Index> hystrixGet(){
        List<Index> list= new ArrayList<>();
        Index index= new Index();
        index.setCode("无信息！！");
        index.setName("无信息！！");
        list.add(index);
        return list;
    }
}
